#include "complex.hpp"

#include <stdio.h>
#include <math.h>  // atan2, sqrt

Complex::Complex(){
	re = 0; im = 0;
}
Complex::Complex(double _re){ re = _re; im = 0; } // Конструктор преобразования
Complex::Complex(double _re, double _im){ re = _re; im = _im; }
Complex::Complex(const Complex &Z){ re = Z.re; im = Z.im; } // Конструктор копирования

// Константные методы
double Complex::real()   const { return re; }
double Complex::imag()   const { return im; } 
double Complex::modulo() const { return sqrt(re*re + im*im); }
double Complex::angle()  const { return atan2(im, re); }
	
// Переопределение оператора присваивания
const Complex& Complex::operator=(const Complex &rhs){
	if(this != &rhs){
		this->re = rhs.re;
		this->im = rhs.im;
	}
	return *this;
}
	


// Переопределение арифметических операций
Complex operator+(const Complex &lhs, const Complex &rhs){
	return Complex(lhs.re + rhs.re, lhs.im + rhs.im);
}

Complex operator-(const Complex &lhs, const Complex &rhs){
	return Complex(lhs.real() - rhs.real(), lhs.imag() - rhs.imag());
}
Complex operator*(const Complex &lhs, const Complex &rhs){
	return Complex( lhs.real()*rhs.real() - lhs.imag()*rhs.imag(),
					lhs.imag()*rhs.real() + lhs.real()*rhs.imag());
}
Complex operator/(const Complex &lhs, const Complex &rhs){
	double rhs_mod_sqr = rhs.modulo()*rhs.modulo();
	return Complex((lhs.real()*rhs.real() + lhs.imag()*rhs.imag())/rhs_mod_sqr,
				   (lhs.imag()*rhs.real() - lhs.real()*rhs.imag())/rhs_mod_sqr);
}

// Переопределение операций сравнения
bool operator==(const Complex &lhs, const Complex &rhs){
	return (lhs.real() == rhs.real()) && (lhs.imag() == rhs.imag());
}
bool operator!=(const Complex &lhs, const Complex &rhs){
	return !(lhs == rhs);
}

// Печать комплексного числа в виде (x,y)
void print(const Complex &z){
	printf("(%g,%g)\n", z.real(), z.imag());
}

